/**
  ******************************************************************************
  * @文件     bsp.c
  * @作者     hero_cao
  * @版本     V1.0.0
  * @日期     2025/06/14
  * @概要     硬件spi初始化
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "./spi/spi.h"
#include "./board/bsp.h"

/* Private macros ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/


/**
 * @brief       SPI2初始化代码
 *   @note      主机模式,8位数据
 * @param       无
 * @retval      无
 */
void spi2_init(void)
{
    gpio_init_type gpio_init_struct;
	spi_init_type spi_init_struct;

	crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
	crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
	gpio_default_para_init(&gpio_init_struct);

	/* software cs */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
	gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_pull           = GPIO_PULL_UP;
	gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;
	gpio_init_struct.gpio_pins           = GPIO_PINS_12;
	gpio_init(GPIOB, &gpio_init_struct);
	
	/* configure the SCK/MISO/MOSI pin */
	gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
	gpio_init_struct.gpio_pins = GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15;
	gpio_init(GPIOB, &gpio_init_struct);
	
	gpio_bits_set(GPIOB, GPIO_PINS_12);

	spi_default_para_init(&spi_init_struct);

	/* configure param */
	spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
	spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
	spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
	spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
	spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;
	spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
	spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
	spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
	spi_init(SPI2, &spi_init_struct);
	
	spi_enable(SPI2, TRUE);
}

/**
 * @brief       SPI2读写一个字节数据
 * @param       txdata  : 要发送的数据(1字节)
 * @retval      接收到的数据(1字节)
 */
uint8_t spi2_read_write_byte(uint8_t txdata)
{
    while (spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);	/* 等待发送区空 */
    spi_i2s_data_transmit(SPI2, txdata);                  		/* 发送一个byte */
    while (spi_i2s_flag_get(SPI2, SPI_I2S_RDBF_FLAG) == RESET);	/* 等待接收完一个byte */
    return spi_i2s_data_receive(SPI2);                    		/* 返回收到的数据 */
}

/**
 * @brief       SPI1初始化代码
 *   @note      主机模式,8位数据
 * @param       无
 * @retval      无
 */
void spi1_init(void)
{
    gpio_init_type gpio_init_struct;
	spi_init_type spi_init_struct;

	crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
	crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
	gpio_default_para_init(&gpio_init_struct);

	/* software cs */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
	gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_pull           = GPIO_PULL_UP;
	gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;
	gpio_init_struct.gpio_pins           = GPIO_PINS_4 | GPIO_PINS_6;
	gpio_init(GPIOA, &gpio_init_struct);
	
	/* configure the SCK/MISO/MOSI/CS pin */
	gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
	gpio_init_struct.gpio_pins = GPIO_PINS_5 | GPIO_PINS_7;
	gpio_init(GPIOA, &gpio_init_struct);
	
	gpio_bits_set(GPIOA, GPIO_PINS_4);

	spi_default_para_init(&spi_init_struct);

	/* configure param */
	spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
	spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
	spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
	spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
	spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;
	spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW;
	spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;
	spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
	spi_init(SPI1, &spi_init_struct);

	spi_enable(SPI1, TRUE);
}

/**
 * @brief       SPI1写一个字节数据
 * @param       txdata  : 要发送的数据(1字节)
 * @retval      无
 */
void spi1_write_byte(uint8_t txdata)
{
    while (spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);	/* 等待发送区空 */
    spi_i2s_data_transmit(SPI1, txdata);                  		/* 发送一个byte */
	while (spi_i2s_flag_get(SPI1, SPI_I2S_BF_FLAG) == SET);		/* 等待SPI空闲 */
}

/**
 * @brief       SPI4初始化代码
 *   @note      主机模式,8位数据
 * @param       无
 * @retval      无
 */
void spi4_init(void)
{
    gpio_init_type gpio_init_struct;
	spi_init_type spi_init_struct;

	crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);
	crm_periph_clock_enable(CRM_SPI4_PERIPH_CLOCK, TRUE);
	crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
	gpio_default_para_init(&gpio_init_struct);
	
	/* software cs */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
	gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_pull           = GPIO_PULL_UP;
	gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;
	gpio_init_struct.gpio_pins           = GPIO_PINS_12 | GPIO_PINS_13;
	gpio_init(GPIOE, &gpio_init_struct);
	
	gpio_bits_set(GPIOE, GPIO_PINS_12);
	
	/* configure the SCK/MISO/MOSI pin */
	gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
	gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_14;
	gpio_init(GPIOE, &gpio_init_struct);
	
	gpio_pin_remap_config(SPI4_GMUX_0001, TRUE);

	spi_default_para_init(&spi_init_struct);

	/* configure param */
	spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
	spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
	spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
	spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
	spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_4;
	spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW;
	spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;
	spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
	spi_init(SPI4, &spi_init_struct);
	
	spi_enable(SPI4, TRUE);
}

/**
 * @brief       SPI4写一个字节数据
 * @param       txdata  : 要发送的数据(1字节)
 * @retval      无
 */
void spi4_write_byte(uint8_t txdata)
{
    while (spi_i2s_flag_get(SPI4, SPI_I2S_TDBE_FLAG) == RESET);	/* 等待发送区空 */
    spi_i2s_data_transmit(SPI4, txdata);                  		/* 发送一个byte */
	while (spi_i2s_flag_get(SPI4, SPI_I2S_BF_FLAG) == SET);		/* 等待SPI空闲 */
}

/**
 * @brief       SPI4读一个字节数据
 * @param       无
 * @retval      接收到的数据(1字节)
 */
uint8_t spi4_read_byte(void)
{
    while (spi_i2s_flag_get(SPI4, SPI_I2S_RDBF_FLAG) == RESET);	/* 等待接收完一个byte */
    return spi_i2s_data_receive(SPI4);                    		/* 返回收到的数据 */
}

/**
 * @brief       SPI4写一个字节数据
 * @param       txdata  : 要发送的数据(1字节)
 * @retval      无
 */
void spi4_write_data(uint8_t data)
{
    while ((SPI4->sts & 1 << 1) == 0);	/* 等待发送区空 */
    SPI4->dt = data;                  	/* 发送一个byte */
}
